#include "at24c02.h"

/**
 * @brief 向AT24C02写入数据
 * @param addr 要写入的地址
 * @param dat 要写入的数据
 * @note 注意：当我们要使用下面写入int类型的数据的时候，不需要手动去将地址乘以2，因为该函数已经帮我们做了这个操作。
 * @note 注意：比如要存10个int数据，那我们只需要地址写0到9即可，无需手动去写地址乘以2。
 */

//写入int类型函数
void v_AtW(unsigned char addr, unsigned int dat)
{
	I2CStart();
	I2CSendByte(0xA0); //写命令
	I2CWaitAck();
	I2CSendByte(addr*2);
	I2CWaitAck();
	I2CSendByte(dat >> 8);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}
//读int类型函数
unsigned int u_AtR(unsigned char addr)
{
 unsigned int _data;
	I2CStart();
	I2CSendByte(0xA0); //写命令
	I2CWaitAck();
	I2CSendByte(addr*2);
	I2CWaitAck();
	I2CStart();
	I2CSendByte(0xA1); //读命令
	I2CWaitAck();
	_data = I2CReceiveByte();
	I2CSendAck(0);
	_data = _data << 8 | I2CReceiveByte();
	I2CStop();
	return _data;
}


//************eeprom的初始化和读写底层代码*************

// 注意：当我们要连续写入数据时，在每次写入数据之后都要至少延迟5ms再进行下一次数据写入，否则会导致数据丢失。
//存储char类型数据
void write_AT24C02(unsigned char addr,unsigned char dat)
{
	I2CStart();
	I2CSendByte(0xa0);/* 写操作 */
	I2CWaitAck();
	I2CSendByte(addr);/* 确定要写入的地址 */
	I2CWaitAck();
	I2CSendByte(dat);/* 写入数据 */
	I2CSendAck(1);
	I2CStop();
}

//读出char类型数据
unsigned char read_AT24C02(unsigned char addr)//因为该存储器为8位寄存器，所以我们返回值的类型为unsigned char（8位）
{
	unsigned char dat=0;
	
	I2CStart();
	I2CSendByte(0xa0);/* 写操作 */
	I2CWaitAck();
	I2CSendByte(addr);/* 将要读取的地址写入 */
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0xa1);/* 读操作 */
	I2CWaitAck();
	dat=I2CReceiveByte();/* 用变量将数据保存 */
	I2CSendAck(1);//（非应答）停止数据传输
	I2CStop();
	
	return dat;
}